from typing import List
class Solution:


    ##确题目要求的是使得这m个子数组各自和的最大值最小。这个最大值是在一个范围内的，即在数组中最大元素和整个数组元素和之间.
    ##因为子数组至少包含一个元素，所以所有不同分法的各个子数组和最大值的最小值就是数组中的最大值
    def splitArray(self, nums: List[int], m: int) -> int:
        def can_split(mid: int) -> bool:
            count, curSum = 1, 0
            for num in nums:
                curSum += num

                if curSum > mid:
                    ##意味着当前子数组的和已经超过了我们设定的上界mid。因此，
                    ##我们需要将当前元素num分配到一个新的子数组中，以保证每个子数组的和都不超过mid
                    curSum = num
                    ##代表我们已经找到了一个满足条件的子数组，所以子数组的数量加1
                    count += 1
            return count <= m

        left, right = max(nums), sum(nums)
        while left < right:
            mid = left + (right - left) // 2
            if can_split(mid):
                right = mid
            else:
                left = mid + 1

        return left
